perm filename FLIST.SAI[SYS,HE] blob
sn#021173 filedate 1973-01-22 generic text, type T, neo UTF8
COMMENT ⊗ VALID 00003 PAGES
RECORD PAGE DESCRIPTION
00001 00001
00002 00002 BEGIN "FLIST"
00004 00003 SIMPLE BOOLEAN PROCEDURE TEST(STRING PN INTEGER PL)
00008 ENDMK
⊗;
BEGIN "FLIST"
REQUIRE 5000 STRING_SPACE;
EXTERNAL INTEGER SPALL;
STRING COM, FILE, PAGE, FP, LP, T, LIN;
DEFINE CR="'15", LF="'12", FF="'14", DSK="1", LPT="2";
INTEGER BRK, EOF, FLG, FL, LL, L, COUNT, LOC, SP, TP, PAGIND;
BOOLEAN SPOOL;
LABEL LOOP, NXTSET;
PRELOAD_WITH [128] 0;
SAFE INTEGER ARRAY SPLFIL[0:127];
SIMPLE PROCEDURE GET;
BEGIN
PAGE ← INPUT(DSK,4);
CASE LOC OF
BEGIN "CASE1"
BEGIN "FIRST";
T ← PAGE;
LIN ← SCAN(T,3,BRK);
L ← LENGTH(LIN);
END "FIRST";
L ← IF PAGE[∞ FOR 1]=LF THEN LENGTH(PAGE)-2
ELSE LENGTH(PAGE);
;
END "CASE1";
COUNT ← COUNT+1;
IF ¬(COUNT MOD 5) THEN OUTSTR(" "&CVS(COUNT));
END;
SIMPLE INTEGER PROCEDURE XWD;
START_CODE
HRL 1,SP;
HRR 1,TP;
END;
SIMPLE BOOLEAN PROCEDURE TEST(STRING PN; INTEGER PL);
BEGIN
IF PL≤0 THEN RETURN(FALSE);
CASE LOC OF
BEGIN "CASE2"
RETURN(L≥PL∧EQU(PN,LIN[L+1-PL FOR PL]));
RETURN(L≥PL∧EQU(PN,PAGE[L+1-PL FOR PL]));
BEGIN "DECIDE"
T ← PAGE;
LIN ← SCAN(T,3,BRK);
L ← LENGTH(LIN);
IF L≥PL∧EQU(PN,LIN[L+1-PL FOR PL]) THEN
BEGIN
LOC ← 0;
RETURN(TRUE);
END;
L ← IF PAGE[∞ FOR 1]=LF THEN LENGTH(PAGE)-2
ELSE LENGTH(PAGE);
IF L≥PL∧EQU(PN,PAGE[L+1-PL FOR PL]) THEN
BEGIN
LOC ← 1;
RETURN(TRUE);
END;
END "DECIDE";
END "CASE2";
RETURN(FALSE);
END "TEST";
SETBREAK(1," ",NULL,"I");
SETBREAK(2," →",NULL,"I");
SETBREAK(3,LF,CR,"I");
SETBREAK(4,FF,NULL,"I");
LOOP: OUTSTR(CR&LF&"*");
COUNT ← 0;
COM ← INCHWL;
LOC ← 2;
L←COM[1 FOR 1];
IF (SPOOL←COM="*") THEN COM←COM[2 FOR ∞];
IF COM="↑" THEN BEGIN LOC←0; COM←COM[2 FOR ∞]; END;
IF COM="↓" THEN BEGIN LOC←1; COM←COM[2 FOR ∞]; END;
DO FILE←SCAN(COM,1,BRK) UNTIL LENGTH(FILE)∨¬LENGTH(COM);
IF ¬LENGTH(FILE) THEN GO TO LOOP;
IF SPOOL THEN
BEGIN "SPINIT"
SPLFIL[7] ← CVFIL(FILE,SPLFIL[8],SPLFIL[10]);
SPLFIL[14] ← '100;
PAGIND ← 15;
END "SPINIT" ELSE BEGIN "NOSPOOL"
OPEN(LPT,"LPT",0,0,6,0,BRK,EOF←FALSE);
ENTER(LPT,"FLIST.LST",FLG);
END "NOSPOOL";
OPEN(DSK,"DSK",0,6,0,10000,BRK,EOF←FALSE);
LOOKUP(DSK,FILE,FLG);
IF FLG THEN
BEGIN
OUTSTR(FILE&" NOT FOUND");
GO TO LOOP;
END;
GET;
NXTSET: DO FP←SCAN(COM,2,BRK) UNTIL LENGTH(FP)∨BRK="→"∨¬BRK;
FL ← LENGTH(FP);
IF BRK="→" THEN
BEGIN
DO LP←SCAN(COM,1,BRK) UNTIL LENGTH(LP)∨¬BRK;
LL ← LENGTH(LP);
END ELSE LL ← -1;
IF FL THEN WHILE ¬(EOF∨TEST(FP,FL)) DO GET;
IF ¬EOF THEN
BEGIN
SP ← COUNT;
DO BEGIN
IF ¬SPOOL THEN OUT(LPT,PAGE&FF);
IF EOF THEN
BEGIN
COUNT ← COUNT+1;
DONE;
END;
GET;
END UNTIL LL=-1∨TEST(LP,LL);
TP ← COUNT-1;
IF SPOOL THEN IF PAGIND+1>126 THEN
OUTSTR("TOO MANY PAGES")
ELSE SPLFIL[PAGIND←PAGIND+1] ← XWD;
IF LENGTH(COM) THEN GO TO NXTSET;
END;
IF SPOOL THEN IF PAGIND=15 THEN OUTSTR("NO OUTPUT") ELSE
BEGIN "SPEND" LABEL L1;
SPLFIL[PAGIND+1]←0;
START_CODE
HRRZ 1,SPLFIL;
HRRM 1,L1;
PUSHJ '17,SPALL;
L1: JUMP 0;
END;
END "SPEND" ELSE RELEASE(LPT);
RELEASE(DSK);
GO TO LOOP;
END "FLIST";